/**
 * 
 * @param {延迟执行的函数} fn 
 * @param {延迟的时间} delay 
 * @param {是否立即执行} immediate 
 * @returns 
 */
export default function debounce(fn, delay, immediate) {
  // 定义一个timeout 接收setTimeOut
  var timeout;
  return function() {
    // 获取this
    var context = this;
    // 获取参数
    var args = arguments;
    if (timeout) {
      clearTimeout(timeout)
    }
    // 是否立即执行
    if (immediate) {
      var callNow = !timeout;
      timeout = setTimeout(() => {
        timeout = null
      }, delay)
      if (callNow) {
        fn.apply(context, args)
      }
    } else {
      timeout = setTimeout(() => {
        fn.apply(context, args)
      }, delay)
    }
  }
}